package flst.ipiweb.persistance.dao.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import flst.ipiweb.persistance.dao.DAOFactory;
import flst.ipiweb.persistance.dao.ICommandeDao;
import flst.ipiweb.service.ServiceDate;
import flst.ipiweb.transverse.Adresse;
import flst.ipiweb.transverse.Article;
import flst.ipiweb.transverse.Client;
import flst.ipiweb.transverse.Commande;
import flst.ipiweb.transverse.IPIException;
import flst.ipiweb.transverse.LigneCommande;
import flst.ipiweb.transverse.ModeDeLivraison;
import flst.ipiweb.transverse.ModeDePaiement;
import flst.ipiweb.transverse.Relai;
import flst.ipiweb.transverse.Status;

public class CommandeDaoJdbc implements ICommandeDao{

	private JdbcUtils jdbcUtils = JdbcUtils.getInstance();
	
	@Override
	/**
	 * Cette méthode permet de créer une commande en base
	 * @param commande : la commande à créer
	 * @return Commande : la commande mise à jour
	 */
	public Commande createCommande(Commande commande) {
		// A implémenter dans le lot 2
		return null;
	}
	
	@Override
	/**
	 * Cette méthode permet de mettre à jour une commande en base
	 * @param commande : la commande à mettre à jour
	 * @return Commande : la commande mise à jour
	 */
	public void updateCommandeStatus(Commande commande) throws IPIException {
		try {
			Connection vConnection = jdbcUtils.getConnection();
			String vRequeteUpdate = "UPDATE IPII_ORDERS SET STATUS = ? WHERE ORDER_ID = ?";
			PreparedStatement vPs = vConnection.prepareStatement(vRequeteUpdate);
			
			// statut
			vPs.setString(1, commande.getStatut().name());

			// commande_id
			vPs.setInt(2, commande.getIdCommande());
			vPs.executeUpdate();

			vPs.close();
			vConnection.close();
		} catch (Exception e) {
			throw new IPIException("Echec de la mise à jour de la commande");
		}
	}
	
	@Override
	/**
	 * Cette méthode permet de rechercher une commande en base grâce à son numéro de commande
	 * @param numCommande : le numéro de commande de la commande recherchée
	 * @return Commande: la commande trouvée
	 */
	public Commande RechercheCommande(String numCommande) throws IPIException {
		Commande commande = new Commande();
		
		try
		{
			Connection vConnection = jdbcUtils.getConnection();
			Statement vStmt = vConnection.createStatement();
			
			String vRequeteSelect = "SELECT orders.*, delivery.*, user.USER_ID, shipping.* FROM IPII_ORDERS as orders, IPII_DELIVERY_MODES as delivery, IPII_USERS as user, IPII_SHIPPING_MODES as shipping WHERE user.USER_ID = orders.USER_ID AND orders.DELIVERY_MODE_ID = delivery.DELIVERY_MODE_ID AND shipping.SHIPPING_MODE_ID = orders.SHIPPING_MODE_ID AND ORDER_NUMBER = ?";
			PreparedStatement vPs = vConnection.prepareStatement(vRequeteSelect);
			// par id
			vPs.setString(1, numCommande);
			ResultSet vRs = vPs.executeQuery();
			vRs.next();
				
			//ORDER_ID
			commande.setIdCommande(vRs.getInt("ORDER_ID"));
			//ORDER_NUMBER 
			commande.setNumeroCommande(vRs.getString("ORDER_NUMBER"));
			//STATUS
			Status statut = Status.valueOf(vRs.getString("STATUS"));
			commande.setStatut(statut);
			//USER_ID 
			//CLIENT
			int idUser = vRs.getInt("USER_ID");
			Client client = DAOFactory.getInstance().getClientDao().getClientById(idUser);
			commande.setClient(client);
			
			//ADRESSE LIVRAISON
			//ADDRESS_LINE_1 
			Adresse adresse = new Adresse();
			adresse.setAdresse(vRs.getString("ADDRESS_LINE_1"));
			//ADDRESS_LINE_2 
			adresse.setComplementsAdresse(vRs.getString("ADDRESS_LINE_2"));
			//ZIP_CODE 
			adresse.setCodePostal(vRs.getString("ZIP_CODE"));
			//CITY 
			adresse.setVille(vRs.getString("CITY"));
			commande.setAdresse(adresse);
			
			//DELIVERY_MODE_ID 
			ModeDeLivraison modeLivraison = new ModeDeLivraison();
			modeLivraison.setIdMode(vRs.getInt("DELIVERY_MODE_ID"));
			modeLivraison.setLibelle(vRs.getString("DELIVERY_MODE_CODE"));
			commande.setModeLivraison(modeLivraison);
			//SHIPPING_MODE_ID 
			ModeDePaiement modePaiement = new  ModeDePaiement();
			modePaiement.setIdModePaiement(vRs.getInt("SHIPPING_MODE_ID"));
			modePaiement.setLibelle(vRs.getString("SHIPPING_MODE_CODE"));
			commande.setModeDePaiement(modePaiement);
			//DELIVERY_CENTER_ID 
			int idRelai = vRs.getInt("DELIVERY_CENTER_ID");
			Relai relai = DAOFactory.getInstance().getRelaiDao().getRelaiById(idRelai);			
			commande.setRelai(relai);
			//CREATION_DATE 
			ServiceDate sDate = new ServiceDate();
			commande.setDateCommande(sDate.convertSqlDateToDate(vRs.getDate("CREATION_DATE")));
			//AMOUNT
			commande.setMontant(vRs.getFloat("AMOUNT"));
			
			commande.setListeArticle(this.getAllLigneCommande(commande.getIdCommande()));
					
			vStmt.close();
			vConnection.close();
		}
		catch(Exception e)
		{
			throw new IPIException("CommandeException.notExist");
		}
		return commande;
	}
	
	
	/**
	 * Cette méthode permet de lister les produits d'une commande
	 * @param idCommande
	 * @return une liste de ligne de commande
	 */
	public List<LigneCommande> getAllLigneCommande(int idCommande)
	{
		List<LigneCommande> listLigneCommande = new ArrayList<LigneCommande>();
		
		try
		{
			Connection vConnection = jdbcUtils.getConnection();
			Statement vStmt = vConnection.createStatement();
			
			String vRequeteSelect = "SELECT * FROM IPII_ORDER_LINES WHERE ORDER_ID = ?";
			PreparedStatement vPs = vConnection.prepareStatement(vRequeteSelect);
			// par id
			vPs.setInt(1, idCommande);
			ResultSet vRs = vPs.executeQuery();
			
			while(vRs.next())
			{
				LigneCommande ligneCommande = new LigneCommande();
				//ORDER_LINE_ID
				ligneCommande.setIdLigneCommande(vRs.getInt("ORDER_LINE_ID"));
				
				Article article = new Article();
				//PRODUCT_ID 
				article.setIdArticle(vRs.getInt("PRODUCT_ID"));
				//PRODUCT_NUMBER
				article.setReferenceArticle(vRs.getInt("PRODUCT_NUMBER"));
				//MODEL 
				article.setModele(vRs.getString("MODEL"));
				//SHORT_DESCRIPTION 
				article.setDescriptionCourte(vRs.getString("SHORT_DESCRIPTION"));
				//QUANTITY 
				ligneCommande.setQuantite(vRs.getInt("QUANTITY"));
				//PRICE 
				article.setPrix(vRs.getFloat("PRICE"));
				
				ligneCommande.setArticle(article);
				listLigneCommande.add(ligneCommande);
			}
				
			vStmt.close();
			vConnection.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return listLigneCommande;
	}
	
}
